package com.wll.libcommon.utils;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Insets;
import android.os.Build;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;

import androidx.core.view.WindowInsetsCompat;

public class StatusBar {
    private static final String TAG = "StatusBar";
    /**
     * 6.0级以上的沉浸式布局
     *
     * @param activity
     */
    public static void fitSystemBar(Activity activity) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            return;
        Window window = activity.getWindow();

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            Log.e(TAG,"fitSystemBar Build.VERSION.SDK_INT < Build.VERSION_CODES.R");
            View decorView = window.getDecorView();
            //View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN--能够使得我们的页面布局延伸到状态栏之下，
            //但不会隐藏状态栏。也就相当于状态栏是遮盖在布局之上的
            //View.SYSTEM_UI_FLAG_FULLSCREEN -- 能够使得我们的页面布局延伸到状态栏，但是会隐藏状态栏。
            //View.SYSTEM_UI_FLAG_FULLSCREEN与WindowManager.LayoutParams.FLAG_FULLSCREEN效果相同
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(Color.TRANSPARENT);
            return;
        }
        Log.e(TAG,"fitSystemBar Build.VERSION.SDK_INT >= Build.VERSION_CODES.R");
        /**  设置装饰视图是否适合WindowInsets的根级别内容视图。
         * 如果设置为true，则框架将检查现已弃用的 #SYSTEM_UI_LAYOUT_FLAGS以及
         * WindowManager.LayoutParams＃SOFT_INPUT_ADJUST_RESIZE标志，并根据这些标志适配内容。
         * 如果设置为false，则框架将使内容视图不适合插入，而仅将WindowInsets传递到内容视图。
         * @param decorFitsSystemWindows装饰视图是否应适合WindowInsets的根目录内容视图。*/
        window.setDecorFitsSystemWindows(true);
        WindowInsetsController controller = window.getInsetsController();
        if (controller != null) {
            /**使一组窗口导致插图消失。
             * 请注意，如果窗口当前无法控制某种类型，则它将在窗口获得控制权后立即应用更改。
             * 该应用可以通过观察View＃onApplyWindowInsets并使用WindowInsets＃isVisible检查可见性来监听事件。
             * @param类型InsetsType的位掩码，指定应用程序要消失的窗口。*/
//            controller.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
//            controller.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);

            /**
             * 控制系统栏的外观。
             * 例如，以下语句添加APPEARANCE_LIGHT_STATUS_BARS：
             * setSystemBarsAppearance（APPEARANCE_LIGHT_STATUS_BARS，APPEARANCE_LIGHT_STATUS_BARS）
             * 以下语句将其清除：setSystemBarsAppearance（0，APPEARANCE_LIGHT_STATUS_BARS）
             * @param 外观{@link Appearance}标志的位掩码。
             * @param mask指定应更改哪些外观标志。
             * @see #getSystemBarsAppearance
             */
            /**
             * opaque  不透明
             * profile 轮廓, 剖面, 侧面, 侧影, 侧面像, 外貌
             * low profile 低调 ，不那么明显
             *使状态栏变得不透明，具有深色背景和浅色前景。int APPEARANCE_OPAQUE_STATUS_BARS = 1;
             *使导航栏变得不透明，具有深色背景和浅色前景。int APPEARANCE_OPAQUE_NAVIGATION_BARS = 1 << 1;
             *使系统栏上的项目变得不那么明显，而无需更改栏的布局。 int APPEARANCE_LOW_PROFILE_BARS = 1 << 2;
             *更改指示灯状态栏的前景色，以便可以清楚阅读该栏上的项目。int APPEARANCE_LIGHT_STATUS_BARS = 1 << 3;
             *更改浅色导航栏的前景色，以便可以清楚阅读该栏上的项目。int APPEARANCE_LIGHT_NAVIGATION_BARS = 1 << 4;
             */
            controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
                    WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS);
        }
    }

    /**
     * 6.0及以上的状态栏色调
     *
     * @param activity
     * @param light    true:白底黑字,false:黑底白字
     */
    public static void lightStatusBar(Activity activity, boolean light) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            return;
        Window window = activity.getWindow();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            View decorView = window.getDecorView();
            int visibility = decorView.getSystemUiVisibility();
            if (light) {
                visibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
            } else {
                visibility &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
            }
            decorView.setSystemUiVisibility(visibility);
            return;
        }

        WindowInsetsController controller = window.getInsetsController();
        if (controller != null) {
            if (light) {
                controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
                        WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS);
            } else {
                controller.setSystemBarsAppearance(0,
                        WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS);
            }
        }
    }
}
